package com.ffcc.fitness.user.service;

import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 用户会话管理服务
 */
@Slf4j
@Service
public class UserSessionService {

    /**
     * 执行用户登录，如果用户已在其他设备登录则踢下线
     * @param userId 用户ID
     * @return 新的token信息
     */
    public cn.dev33.satoken.stp.SaTokenInfo loginWithKickout(Long userId) {
        // 检查用户是否已在其他地方登录
        if (StpUtil.isLogin(userId)) {
            log.info("用户 {} 在其他设备已登录，踢下线原会话", userId);
            // 踢出指定用户的所有会话
            StpUtil.kickout(userId);
        }
        
        // 执行登录
        StpUtil.login(userId);
        log.info("用户 {} 登录成功，新token: {}", userId, StpUtil.getTokenValue().substring(0, 8) + "...");
        
        return StpUtil.getTokenInfo();
    }

    /**
     * 检查用户当前token是否有效
     * @param userId 用户ID
     * @return token是否有效
     */
    public boolean isTokenValid(Long userId) {
        try {
            return StpUtil.isLogin(userId);
        } catch (Exception e) {
            log.warn("检查用户 {} token有效性时出错: {}", userId, e.getMessage());
            return false;
        }
    }

    /**
     * 获取当前用户的token信息
     * @return token信息
     */
    public cn.dev33.satoken.stp.SaTokenInfo getCurrentTokenInfo() {
        try {
            if (StpUtil.isLogin()) {
                return StpUtil.getTokenInfo();
            }
            return null;
        } catch (Exception e) {
            log.warn("获取当前token信息时出错: {}", e.getMessage());
            return null;
        }
    }

    /**
     * 用户退出登录
     * @param userId 用户ID
     */
    public void logout(Long userId) {
        try {
            if (StpUtil.isLogin(userId)) {
                StpUtil.logout(userId);
                log.info("用户 {} 退出登录成功", userId);
            }
        } catch (Exception e) {
            log.warn("用户 {} 退出登录时出错: {}", userId, e.getMessage());
        }
    }

    /**
     * 踢出指定用户
     * @param userId 用户ID
     */
    public void kickoutUser(Long userId) {
        try {
            if (StpUtil.isLogin(userId)) {
                StpUtil.kickout(userId);
                log.info("管理员踢出用户 {} 成功", userId);
            }
        } catch (Exception e) {
            log.warn("踢出用户 {} 时出错: {}", userId, e.getMessage());
        }
    }
}
